package internal

import (
	"fmt"
	"time"
)

// User GORM 模型定义
type User struct {
	Id   int    `gorm:"primary_key"` //表字段名：id，主键
	Name string `gorm:"not null"`    //模型标签，name字段不能为空
	Age  int    //年龄age字段
	//对应表中的create_time字段不能为空
	CreateTime time.Time `gorm:"column:create_time; not null"`
}

// 标签定义部分，多个标签定义可以使用分号（;）分隔,
// 比如`gorm:"column:create_time; not null"`
// `gorm`标签语法：`gorm:"标签定义"`

/* 常用的标签
标签			说明			例子
COLUMN		指定列名		gorm:"column:create_time"
PRIMARY_KEY	指定主键		gorm:"column:id; PRIMARY_KEY"
NOT NULL		列非空		gorm:"not null"
-			忽略字段		gorm:"-"	可以忽略 structType 字段，被忽略的字段不参与 gorm 的读写操作	*/

// InsertUser 方法用于插入数据
func (user *User) InsertUser() (err error) {
	// Table() 函数用于指定表名，若未指定全局禁用复数，这里指定的表名 user 是不可以用的，因为 user 表不存在
	createDb := DB.Table("user").Create(user)
	/* 1.也可以不使用 Table() 这个函数。直接进行 DB.Create(user)
	2.若同时存在 user 和 users 表，DB.Create(user) 在哪个表新增数据取决于是否指定全局禁用复数
	  若禁用，则在 user 表中新增数据，反之在 users 表中新增数据
	3.若结构体名改为 Users，虽然全局禁用了复数，但数据仍在 users 表中新增
	  因为这时创建或使用的表名会与结构体名相同，而全局禁用复数是为了创建或使用'非复数的结构体名'的表 */
	//createDb := DB.Create(user)
	if err = createDb.Error; err != nil {
		fmt.Printf("新增数据错误！\nError: %v\n", err)
		return err
	}
	return nil
}

// DeleteUser 方法用于删除数据
func (user *User) DeleteUser() (err error) {
	// Save 会更新所有字段，即使你没有赋值，没赋值的更新为 0 或 null，且非空属性必须赋值
	// 一般建议使用 DB.Model(&user).Update(user)
	deleteUser := DB.Delete(&user)
	if err := deleteUser.Error; err != nil {
		fmt.Printf("删除数据错误！\nError: %v\n", err)
		return err
	}
	return nil
}

// UpdateUser 方法用于更新数据
func (user *User) UpdateUser() (err error) {
	// 注意，Model 方法必须要和 Update 方法一起使用，否则 DB.Update(user) 这样更新数据不生效
	// 使用效果相当于 Model 中设置更新的主键 key(若没有 WHERE 指定，那么默认更新的 key 为 id)，Update 中设置更新的值
	// 若 Model 中没有指定 id 值，且也没有指定 WHERE 条件，那么将更新全表
	updateDb := DB.Model(&user).Update(user)

	if err := updateDb.Error; err != nil {
		fmt.Printf("更新数据错误！\nError: %v\n", err)
		return err
	}
	return nil
}

// SaveUser 更新所有字段数据
func (user *User) SaveUser() (err error) {
	// Save 会更新所有字段，即使你没有赋值，没赋值的更新为 0 或 null，且非空属性必须赋值
	// 一般建议使用 DB.Model(&user).Update(user)
	updateDb := DB.Save(&user)

	if err := updateDb.Error; err != nil {
		fmt.Printf("更新数据错误！\nError: %v\n", err)
		return err
	}
	return nil
}
